package main

import "fmt"

// IObserver
// @Description: 观察者接口
type IObserver interface {
	Update(msg string)
}

// ObserverOne
// @Description: 观察者实现1
type ObserverOne struct {
	No string
}

func (o *ObserverOne) Update(msg string) {
	fmt.Printf("观察者%s-接收更新: %s \n", o.No, msg)
}

// ObserverTwo
// @Description: 观察者实现2
type ObserverTwo struct {
	No string
}

func (o *ObserverTwo) Update(msg string) {
	fmt.Printf("观察者%s-接收更新: %s \n", o.No, msg)
}

// Subject 观察者主题
type Subject struct {
	observers []IObserver
}

// addObserver
//
//	@Description: 添加观察者
//	@receiver s
//	@param observer
func (s *Subject) addObserver(observer IObserver) {
	s.observers = append(s.observers, observer)
}

// removeObserver
//
//	@Description: 移除观察者
//	@receiver s
//	@param observer
func (s *Subject) removeObserver(observer IObserver) {
	for i, observer := range s.observers {
		if observer == observer {
			s.observers = append(s.observers[:i], s.observers[i+1:]...)
			fmt.Println("移除观察者成功:")
			break
		}
	}
}

// notify
//
//	@Description: 通知所有的观察者
//	@receiver s
//	@param msg
func (s *Subject) notifyAll(msg string) {
	for _, observer := range s.observers {
		observer.Update(msg)
	}
}
func main() {
	subject := &Subject{
		observers: []IObserver{},
	}

	observerOne := &ObserverOne{
		No: "1",
	}
	observerTwo := &ObserverTwo{
		No: "2",
	}

	subject.addObserver(observerOne)
	subject.addObserver(observerTwo)

	subject.notifyAll("发布消息111111")

	subject.removeObserver(observerOne)

	subject.notifyAll("发布消息222222")
}
